﻿using System;
using System.Collections.Generic;
using System.Data.Linq;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Transactions;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using ShopNet.Model;
using ShopNet.Util;

namespace ShopNet
{

    public partial class CheckoutStep1 : System.Web.UI.Page
    {
        #region Propriedades

        public new Shop Master
        {
            get
            {
                return ((Shop)(base.Master));
            }
        }

        protected IList<ProdutoCarrinho> Cesta
        {
            get
            {
                if (Session["cesta"] == null) Session.Add("cesta", new List<ProdutoCarrinho>());
                return (IList<ProdutoCarrinho>)Session["cesta"];
            }
            set { if (value != null) Session.Add("cesta", value); }
        }

        private Usuario Us
        {
            get
            {
                MembershipUser user = Membership.GetUser();
                Usuario us = NServico.Db.Usuarios.FirstOrDefault(u => u.UserId == user.UserName);
                return us;
            }
        }

        #endregion

        #region Metodos

        #region CarregarCidade

        private void CarregarCidade()
        {
            IList<Cidade> lista = NServico.Db.Cidades.Where(c=>c.IdUf==int.Parse(ddlUf.SelectedValue)).ToList();
            ddlCidade.DataSource = lista;
            ddlCidade.DataTextField = "Nome";
            ddlCidade.DataValueField = "IdCidade";
            ddlCidade.DataBind();

            if (lista.Count>0)
                ddlCidade.Items.Insert(0, new ListItem("Selecione...", "0"));
            else
                ddlCidade.Items.Insert(0, new ListItem(".........", "0"));
        }

        #endregion

        #region CarregarUf

        private void CarregarUf()
        {
            IList<Uf> lista = NServico.Db.Ufs.ToList();
            ddlUf.DataSource = lista;
            ddlUf.DataTextField = "Sigla";
            ddlUf.DataValueField = "IdUf";
            ddlUf.DataBind();

            ddlUf.Items.Insert(0, new ListItem("Selecione...", "0"));
        }

        #endregion

        #region CarregarUsuario

        private void CarregarUsuario()
        {
           
            if (Us!=null && Us.IdUsuario > 0)
            {
                tbNome.Text = Us.Nome;
                tbCPF.Text = Us.Cpf;
                tbDdd.Text = Us.Ddd;
                tbTel.Text = Us.Telefone;
                tbNome.Enabled = false;
            }
        }

        #endregion

        #region CarregarEnderecos

        private void CarregarEnderecos()
        {
            if (Us != null && Us.IdUsuario > 0)
            {
                ddlEnd.DataSource = NServico.Db.Enderecos.Where(e=>e.IdUsuario== Us.IdUsuario);
                ddlEnd.DataTextField = "NomeEndereco";
                ddlEnd.DataValueField = "IdEndereco";
                ddlEnd.DataBind();
            }

            ddlEnd.Items.Insert(0, new ListItem("Novo endereço", "0"));
        }

        #endregion
        
        #endregion

        #region Eventos

        #region Page_Load

        protected void Page_Load(object sender, EventArgs e)
        {
            Master.ExibirMensagem(Shop.TipoMensagem.Success, string.Empty);
            MembershipUser usuario = Membership.GetUser();
            
            //if (HttpContext.Current.User.Identity.IsAuthenticated)
            if (usuario == null)
                Response.Redirect("~/Checkout/CheckoutVerifier.aspx", true);
            if (Cesta.Count()==0)
                Response.Redirect("~/Cesta.aspx", true);

            if (!IsPostBack)
            {
                CarregarEnderecos();
                CarregarUsuario();
                CarregarUf();
                CarregarCidade();
            }

        }

        #endregion

        #region ddlUf_IndexChange

        protected void ddlUf_IndexChange(object sender, EventArgs e)
        {
            CarregarCidade();
        }

        #endregion

        #region bcontinuar_Click

        protected void bcontinuar_Click(object sender, EventArgs e)
        {
            IList<string> mensagens = new List<string>();

            #region Validacoes

            /*tbNomeEndereco.CssClass = "form-txt";
            tbNome.CssClass = "form-txt";
            tbEndereco.CssClass = "form-txt";
            ddlUf.CssClass = string.Empty;
            ddlCidade.CssClass = string.Empty;
            tbCep.CssClass = "form-txt";
            tbDdd.CssClass = "form-txt";
            tbTel.CssClass = "form-txt";
            tbCPF.CssClass = "form-txt";
             * */

            if (ddlEnd.SelectedValue.Equals("0") && (string.IsNullOrWhiteSpace(tbNomeEndereco.Text)))
            {
                mensagens.Add("Nome do endereço é obrigatório.");
                ddlEnd.SetCssClassError();
                tbNomeEndereco.SetCssClassError();

            }
            if (string.IsNullOrWhiteSpace(tbNome.Text))
            {
                mensagens.Add("Nome é obrigatório.");
                //tbNome.CssClass = "form-txt error";
                tbNome.SetCssClassError();
            }
            if (string.IsNullOrWhiteSpace(tbCPF.Text))
            {
                mensagens.Add("CPF é Obrigatório.");
                tbCPF.SetCssClassError();
            }
            else
            {
                string cpf = @"^\d{3}\.?\d{3}\.?\d{3}\-?\d{2}$";
                Match match = Regex.Match(tbCPF.Text, cpf);
                if (!match.Success)
                {
                    mensagens.Add("CPF inválido.");
                    tbCPF.SetCssClassError();
                }
            }
            if (string.IsNullOrWhiteSpace(tbDdd.Text))
            {
                mensagens.Add("DDD é obrigatório.");
                tbDdd.SetCssClassError();
            }
            if (string.IsNullOrWhiteSpace(tbTel.Text))
            {
                mensagens.Add("Número de Telefone é obrigatório.");
                tbTel.SetCssClassError();
            }


            if (string.IsNullOrWhiteSpace(tbEndereco.Text))
            {
                mensagens.Add("Endereço é obrigatório.");
                tbEndereco.SetCssClassError();
            }
            if (ddlUf.SelectedValue == "0")
            {
                mensagens.Add("Uf é obrigatória.");
                ddlUf.SetCssClassError();
            }
            if (ddlCidade.SelectedValue == "0")
            {
                mensagens.Add("Cidade é obrigatória.");
                ddlCidade.SetCssClassError();
            }
            if (string.IsNullOrWhiteSpace(tbCep.Text))
            {
                mensagens.Add("Cep é obrigatório.");
                tbCep.SetCssClassError();
            }
            else
            {
                string cep = @"\d{5}\-\d{3}";
                //string cep = @"\^[0-9]{2}\.[0-9]{3}-[0-9]{3}$";
                Match match = Regex.Match(tbCep.Text, cep);
                if (!match.Success)
                {
                    mensagens.Add("CEP inválido (XXXXX-XXX).");
                    tbCep.SetCssClassError();
                }
            }

            if (mensagens.Count > 0)
            {
                Master.ExibirMensagem(Shop.TipoMensagem.Error, mensagens);
                return;
            }

            #endregion

            MembershipUser user = Membership.GetUser();

            using (var tScope = new TransactionScope(TransactionScopeOption.Required))
            {

                #region Dados Usuario
                
                Usuario us = Us;
                if (us == null || us.IdUsuario == 0)
                {
                    if (us == null) us = new Usuario();
                    us.Nome = tbNome.Text;
                    us.UserId = user.UserName;
                    us.Cpf = tbCPF.Text;
                    NServico.Db.Usuarios.InsertOnSubmit(us);
                }

                us.Cpf = tbCPF.Text;
                us.Ddd = tbDdd.Text;
                us.Telefone = tbTel.Text;
                NServico.Db.SubmitChanges(ConflictMode.FailOnFirstConflict);

                #endregion

                #region Endereco

                Endereco endereco = new Endereco();
                int idEndereco = int.Parse(ddlEnd.SelectedValue);
                if (idEndereco > 0)
                {
                    endereco = NServico.Db.Enderecos.FirstOrDefault(ed => ed.IdEndereco == idEndereco);
                }
                else
                    endereco.NomeEndereco = tbNomeEndereco.Text;

                endereco.Endereco1 = tbEndereco.Text;
                endereco.Numero = tbNumero.Text;
                endereco.Complemento = tbComplemento.Text;
                endereco.Bairro = tbBairro.Text;
                //endereco.IdCidade = int.Parse(ddlCidade.SelectedValue);//NServico.Db.Cidades.FirstOrDefault(c => c.IdCidade == int.Parse(ddlCidade.SelectedValue)).IdCidade;
                endereco.Cidade =
                    NServico.Db.Cidades.FirstOrDefault(c => c.IdCidade == int.Parse(ddlCidade.SelectedValue));

                endereco.Cep = tbCep.Text;
                endereco.IdUsuario = us.IdUsuario;
                if (idEndereco == 0)
                {
                    NServico.Db.Enderecos.InsertOnSubmit(endereco);
                }
                NServico.Db.SubmitChanges(ConflictMode.FailOnFirstConflict);

                #endregion

                Session.Remove("IdEndereco");
                Session.Add("IdEndereco", endereco.IdEndereco);

                tScope.Complete();

                Response.Redirect("CheckoutStep2.aspx", true);
            }

        }

        #endregion
        
        #region ddlEnd_Indexchange

        protected void ddlEnd_Indexchange(object sender, EventArgs e)
        {
            if (ddlEnd.SelectedValue == "0")
            {
                tbNomeEndereco.Text = "sem nome";
                tbNomeEndereco.Enabled = true;
            }
            else
            {
                int idEndereco = int.Parse(ddlEnd.SelectedValue);
                Endereco endereco = NServico.Db.Enderecos.FirstOrDefault(ee => ee.IdEndereco == idEndereco);
                tbNomeEndereco.Text = endereco.NomeEndereco;
                tbNomeEndereco.Enabled = false;
                tbEndereco.Text = endereco.Endereco1;
                tbNumero.Text = endereco.Numero;
                tbComplemento.Text = endereco.Complemento;
                tbBairro.Text = endereco.Bairro;
                tbCep.Text = endereco.Cep;
                ddlCidade.SelectedIndex = -1;
                ddlUf.SelectedIndex = -1;

                ListItem li = ddlUf.Items.FindByValue(endereco.Cidade.IdUf.ToString());
                if (li != null) li.Selected = true;
                
                CarregarCidade();

                li = ddlCidade.Items.FindByValue(endereco.IdCidade.ToString());
                if (li != null) li.Selected = true;
                
            }
        }

        #endregion

        #endregion

       

    }
}